﻿#region Using

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using SapFramework.Interface.Controls.Forms.Attributes;
using SapFramework.Interface.Controls.Forms.Base;

#endregion

namespace SapFramework.Queries
{
    /// <summary>
    /// Armazena consultas pré-determinadas para o sistema, relacionadas a formulários do PadaOne.
    /// </summary>
    public static class FormQueries
    {
        /// <summary>
        /// Deixa separado numa constante o tipo de Form, pra não ter que ficar buscando de tudo quando é canto.
        /// </summary>
        public static readonly Type srTypeForm = typeof(Form);

        /// <summary>
        /// Recupera todos os formulários que herdam da classe Form do PadaOne.
        /// </summary>
        /// <returns>Formulários que herdam de Form e não são abstratos</returns>
        public static IEnumerable<Type> GetPadaOneForms()
        {
            return
                from
                    sAssembly in AppDomain.CurrentDomain.GetAssemblies()
                from
                    sObjType in sAssembly.GetTypes()
                where
                    srTypeForm.IsAssignableFrom( sObjType ) && !sObjType.IsAbstract
                select
                    sObjType;
        }

        /// <summary>
        /// Recupera os eventos que fazem parte da classe Form.
        /// </summary>
        /// <returns>Uma lista dos eventos pertencentes a classe Form.</returns>
        public static IEnumerable<EventInfo> GetFormEventMembers()
        {
            return
                from
                    sEvent in srTypeForm.GetEvents( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance )
                select
                    sEvent;
        }

        /// <summary>
        /// Recupera o tipo da classe de um formulário, baseado no valor de seu atributo <see cref="FormTypeAttribute"/>.
        /// </summary>
        /// <param name="aFormType">Código do tipo do formulário no SAP Business One</param>
        /// <returns>O tipo da classe do formulário, ou nulo quando não for encontrado.</returns>
        public static Type GetFormClassBySboFormType( string aFormType )
        {
            IEnumerable<Type> lResults =
                from
                    sObjType in GetPadaOneForms()
                from
                    sAttribute in sObjType.GetCustomAttributes( typeof( FormTypeAttribute ), false )
                where
                    ((FormTypeAttribute)sAttribute).Type == aFormType
                select
                    sObjType;

            return lResults.SingleOrDefault();
        }
    }
}